import React, { RefObject, useRef } from 'react'; import { NextPage } from 'next'; import PrismicRichText from 'prismic-richtext'; import getSentryClient from '../../utils/sentry'; import { getProductPage } from '../../prismic/api'; import { ProductPageData } from '../../typings/entities'; import Hero from '../../components/main/product/Hero'; import Why from '../../components/main/Why'; import Review from '../../components/main/product/Review'; import How from '../../components/main/How'; import FAQ from '../../components/main/FAQ'; import Offers, { convertOffer } from '../../components/main/Offers'; import ErrorPage from '../_error'; import ProductSEO from '../../components/ProductSEO'; import { Header } from '../../components/main/product/Header'; import RichText from '../../components/RichText'; import Cyber from '../../components/main/product/cyber'; interface PageProps { product?: ProductPageData; namespacesRequired?: string[]; hardCodedSlug?: string; error?: boolean; } export type THardcodedPagesSlugs = 'assurance-cybercriminalite'; const HARDCODED_PAGES: Record = { 'assurance-cybercriminalite': Cyber }; const Product: NextPage = ({ product, hardCodedSlug, error }) => { // Important : do not declare a ref before those early returns. They might crash react. if (error) { return ; } if (hardCodedSlug) { return HARDCODED_PAGES[hardCodedSlug]({ product }); } const heroRef: RefObject = useRef(); const { product_name, product_shortname, product_cta_link, product_short_description, product_illustration, product_starting_price, product_price_hover_text, header_cta_label, why_title, why_perks, review_title, reviews, how_it_works_title, how_it_works_steps, faq_link, faq_questions, faq_title, first_offer, second_offer, third_offer, offers_title, offers_find_cta_label, offers_find_cta_link, seo_description, seo_title } = product; return ( <>
( { title: faq_question_title, answer: } ))} link={faq_link} /> !!offer?.data) .map((offer) => convertOffer(offer)) } CTAFindLabel={offers_find_cta_label || 'Je trouve mon offre sur-mesure'} CATFindLink={offers_find_cta_link} CTAButtonColor="white" /> ); }; Product.getInitialProps = async ({ req, query }): Promise => { try { const slug = (query.slug as string); const product = await getProductPage(req, slug); return { hardCodedSlug: Object.keys(HARDCODED_PAGES).indexOf(slug) !== -1 ? slug : null, product: product.data, namespacesRequired: ['common'] }; } catch (err) { if (err.status) { getSentryClient().captureException(new Error( `Cannot fetch product page ${query.slug} ${err.status ? `status ${err.status}` : ''}` )); } return { error: true, namespacesRequired: ['common'] }; } }; export default Product;